/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.resume.contrat.builder;

import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;

import fr.generali.accueilclient.contrat.builder.IConsultContratBuilder;
import fr.generali.accueilclient.contrat.om.IConsultContrat;
import fr.generali.accueilclient.contrat.om.impl.ConsultContrat;
import fr.generali.accueilclient.utils.constantes.CodeRoleEnum;
import fr.generali.refservcommuns.rce.resume.dto.ctr.gestionprimes.DTOPrimeContrat;
import fr.generali.refservcommuns.clients.resume.dto.v4.ctr.structurecontrat.DTOContrat;
import fr.generali.refservcommuns.clients.resume.dto.v4.pty.personnes.DTOPersonneResume;

/**
 * @author Holmes Kelly
 */
public class DTOContrat2ConsultContratBuilder implements IConsultContratBuilder {

    /**
     *
     */
    private IConsultContrat consultContrat;

    /**
     *
     */
    private DTOContrat dtoContrat;

    /**
     * @param dtoContrat
     */
    public DTOContrat2ConsultContratBuilder(DTOContrat dtoContrat) {
        consultContrat = new ConsultContrat();
        this.dtoContrat = dtoContrat;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildNumeroContrat() {
        consultContrat.setNumeroContrat(dtoContrat.getIdentifiant());
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildSystemeOrigine() {
        consultContrat.setSystemeOrigine(dtoContrat.getSystemeOrigine());
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildSocieteDuGroupe() {
        consultContrat.setSocieteDuGroupe(dtoContrat.getSocieteDuGroupe());
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildCodeProduit() {
        consultContrat.setCodeProduit(dtoContrat.getCodeProduit());
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildCategorieStatistique() {
        consultContrat.setCategorieStatistique(dtoContrat.getCodeProduit());
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildCodeSituation() {
        consultContrat.setCodeSituation(dtoContrat.getStatut());
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildModePrelevement() {
        String modeDePrelevement = null;
        if (CollectionUtils.isNotEmpty(dtoContrat.getPrimeContrat())) {
            DTOPrimeContrat primeContrat = dtoContrat.getPrimeContrat().get(0);
            if (primeContrat.getCaracteristiquesCotisationSouscrites() != null) {
                modeDePrelevement = primeContrat.getCaracteristiquesCotisationSouscrites().getModePaiement();
            }
        }
        consultContrat.setModePrelevement(modeDePrelevement);

    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildNatureRecouvrement() {
        consultContrat.setNatureRecouvrement(dtoContrat.getNatureRecouvrement());

    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildLibelleModePrelevement() {

        String modeDePrelevement = null;
        if (CollectionUtils.isNotEmpty(dtoContrat.getPrimeContrat())) {
            DTOPrimeContrat primeContrat = dtoContrat.getPrimeContrat().get(0);
            if (primeContrat.getCaracteristiquesCotisationSouscrites() != null) {
                modeDePrelevement = primeContrat.getCaracteristiquesCotisationSouscrites().getModePaiement();
            }
        }
        consultContrat.setLibelleModePrelevement(getLibelleRecouvrement(modeDePrelevement,
                        dtoContrat.getNatureRecouvrement()));

    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildNumOrdreRIB() {
        List<DTOPrimeContrat> listePrimeContrat = dtoContrat.getPrimeContrat();
        if (CollectionUtils.isNotEmpty(listePrimeContrat)) {

            DTOPrimeContrat dtoPrimeContrat =
                            (DTOPrimeContrat ) CollectionUtils.find(listePrimeContrat, getPredicatePrimeContrat());
            if (dtoPrimeContrat != null) {
                consultContrat.setNumOrdreRIB(dtoPrimeContrat.getCaracteristiquesCotisationSouscrites()
                                .getReferencesBancairesPaiement().getNumOrdre());
            }

        }

    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildIdentifiantRIB() {
        List<DTOPrimeContrat> listePrimeContrat = dtoContrat.getPrimeContrat();
        if (CollectionUtils.isNotEmpty(listePrimeContrat)) {

            DTOPrimeContrat dtoPrimeContrat =
                            (DTOPrimeContrat ) CollectionUtils.find(listePrimeContrat, getPredicatePrimeContrat());
            if (dtoPrimeContrat != null) {
                consultContrat.setIdentifiantRIB(dtoPrimeContrat.getCaracteristiquesCotisationSouscrites()
                                .getReferencesBancairesPaiement().getIdentifiantRCE());
            }

        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildNumOrdreAdresse() {
        consultContrat.setNumOrdreAdresse(getAdresseLiee(dtoContrat.getRolePersonne()));

    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildAdresseSelected() {
        consultContrat.setAdresseSelected(false);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildRibSelected() {
        consultContrat.setRibSelected(false);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildPropag() {

    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildSouscripteur() {
        consultContrat.setSouscripteur(getSouscripteurPayeur(dtoContrat.getRolePersonne(),
                        CodeRoleEnum.ROLE_SOUSCRIPTEUR.getCodeRole()));
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void buildPayeur() {
        consultContrat.setPayeur(getSouscripteurPayeur(dtoContrat.getRolePersonne(),
                        CodeRoleEnum.ROLE_PAYEUR.getCodeRole()));
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public IConsultContrat getConsultContrat() {

        return consultContrat;
    }

    /**
     * on récupère le numéro client du souscripteur ou du payeur
     * 
     * @param listeRoles la liste des roles du contrat
     * @param typeRole S pour souscripteur ou P pour payeur
     * @return le numéro client du souscripteur ou du payeur
     */
    private String getSouscripteurPayeur(List<DTOPersonneResume> listeRoles, String typeRole) {
        String numClient = null;

        for (DTOPersonneResume dTOPersonneResume : listeRoles) {
            if (dTOPersonneResume != null && dTOPersonneResume.getRole().equalsIgnoreCase(typeRole)) {
                return dTOPersonneResume.getIdentifiantRCE();
            }
        }

        return numClient;
    }

    /**
     * Renvoie le libelle recouvrement via le mode recouvrement et la nature
     * recouvrement
     * 
     * @param modeRecouvrement mode recouvrement
     * @param natureRecouvrement nature recouvrement
     * @return le libelle recouvrement
     */
    private String getLibelleRecouvrement(String modeRecouvrement, String natureRecouvrement) {

        String libelle = null;

        if (CHAINE_3.equals(modeRecouvrement) && CHAINE_1.equals(natureRecouvrement)) {
            libelle = PRELEVEMENT_COMPAGNIE;
        } else if (CHAINE_3.equals(modeRecouvrement) && CHAINE_2.equals(natureRecouvrement)) {
            libelle = PRELEVEMENT_AGENCE;
        } else if (CHAINE_6.equals(modeRecouvrement) && CHAINE_1.equals(natureRecouvrement)) {
            libelle = PAIEMENT_PAR_TIP_SIEGE;
        } else if (CHAINE_6.equals(modeRecouvrement) && CHAINE_2.equals(natureRecouvrement)) {
            libelle = PAIEMENT_PAR_TIP_AGENCE;
        }

        return libelle;
    }

    /**
     * on récupère le numéro d'ordre de l'adresse liée au contrat
     * 
     * @param listePersonnes la liste des personnes du contrat
     * @return numOrdreAdresse le numéro d'ordre de l'adresse liée au contrat
     */
    private String getAdresseLiee(List<DTOPersonneResume> listePersonnes) {
        String numOrdreAdresse = null;

        for (DTOPersonneResume dTOPersonneResume : listePersonnes) {
            if (dTOPersonneResume != null && CollectionUtils.isNotEmpty(dTOPersonneResume.getAdresse())) {
                numOrdreAdresse = dTOPersonneResume.getAdresse().get(0).getNumOrdre();
                break;
            }
        }

        return numOrdreAdresse;
    }

    /**
     * @return predicate prime contrat
     */
    private Predicate getPredicatePrimeContrat() {

        Predicate predicate = new Predicate() {

            @Override
            public boolean evaluate(Object object) {

                DTOPrimeContrat dtoPrimeContrat = DTOPrimeContrat.class.cast(object);

                return dtoPrimeContrat != null
                                && dtoPrimeContrat.getCaracteristiquesCotisationSouscrites() != null
                                && dtoPrimeContrat.getCaracteristiquesCotisationSouscrites()
                                                .getReferencesBancairesPaiement() != null;
            }
        };

        return predicate;
    }

}
